class solution_03:

    def findRepeatNumber(self, nums: [int]) -> int:
        """
        :param nums:
        :return:
        """
        dic = set()
        for num in nums:
            # 若set集合内
            # 已有当前元素则返回
            if num in dic:
                return num
            # 无则添加
            dic.add(num)
        return -1

    def findRepeatNumber2(self, nums: [int]) -> int:
        """
        如题额外：在一个长度为 n 的数组 nums 里的所有数字都在 0 ~ n-1 的范围内
        即数组内的数字一定小于等于下标，即有原地交换的思路
            将数组的值与下标一一对应，若遇到重复的，即直接返回
        :param nums: 数组
        :return: 要返回的重复数字
        """
        i = 0
        while i < len(nums):
            # 若下标与数字对应则遍历下一个
            if nums[i] == i:
                i += 1
                continue
            # 否则 查看目标下标的数字 和 要交换的数字 是否相等
            #   若相等则为重复数字，不用交换了
            elif nums[nums[i]] == nums[i]:
                return nums[i]
            #   否则交换
            else:
                nums[nums[i]], nums[i] = nums[i], nums[nums[i]]
        return -1
